package gobelinmaker.server;

import java.awt.Point;

/**
 * Lyukra igazítás célobjektumának osztálya.
 *
 * @author imruf84
 */
public class HoleToSnap {

    /**
     * Motor vezérlő.
     */
    MotorControlRequest mcr;
    /**
     * Legutolsó távolság.
     */
    double lastDistance = -1;
    /**
     * Letapogatandó sorok száma.
     */
    int rowsCount = -1;
    /**
     * Letapogatandó oszlopok száma.
     */
    int columnsCount = -1;
    /**
     * Letapogatás jelenlegi sorának a sorszáma.
     */
    int currentRow = -1;
    /**
     * Letapogatás jelenlegi oszlopának a sorszáma.
     */
    int currentColumn = -1;
    /**
     * Megtalált lyukak száma.
     */
    private long discovered = 0;

    /**
     * Konstruktor.
     *
     * @param mcr motorvezérlés kérése
     */
    public HoleToSnap(MotorControlRequest mcr) {
        this.mcr = mcr;
    }

    /**
     * Letapogatás mód beállítása.
     *
     * @param rows sorok száma
     * @param columns oszlopok száma
     */
    public void toDiscoverMode(int rows, int columns) {
        currentRow = 1;
        currentColumn = 1;
        rowsCount = rows;
        columnsCount = columns;
        discovered = 0;
    }

    /**
     * Letapogatás mód lekérdezése.
     *
     * @return letapogatás mód esetén igaz, egyébként hamis
     */
    public boolean isDiscoverMode() {
        return (!(rowsCount < 0) && !(columnsCount < 0));
    }

    /**
     * Soron következő irány lekérdezése.
     *
     * @return soron következő irány
     */
    public Point3D getNextDirection() {

        Point3D result = new Point3D();

        int dir = ((0 == currentRow % 2) ? -1 : 1);

        if (((1 < currentColumn) || (!(1 < currentColumn) && (dir > 0))) && ((currentColumn < columnsCount) || (!(currentColumn < columnsCount) && (dir < 0)))) {
            result.x = dir;
            currentColumn += result.x;
        } else {
            if (currentRow < rowsCount) {
                result.y = 1;
                currentRow += result.y;
            } else {
                return null;
            }
        }

        discovered++;

        return result;
    }

    /**
     * Folyamat lekrdezése.
     *
     * @return folyamat
     */
    public double getProgress() {
        return ((double) discovered / ((double) rowsCount * (double) columnsCount)) * 100;
    }

    /**
     * Legutolsó tárolt távolság lekérdezése.
     *
     * @return legutolsó tárolt távolság
     */
    public double getLastDistance() {
        return lastDistance;
    }

    /**
     * Legutolsó távolság megadása.
     *
     * @param lastDistance legutolsó távolság
     */
    public void setLastDistance(double lastDistance) {
        this.lastDistance = lastDistance;
    }
}
